1. 按
要想同步两个文件夹中的数据,基本思路首先需要遍历源文件夹中的信息,将源文件夹中的文件复制到目标文件夹,然后再将目标文件夹中有的文件而源文件夹中没有的文件予以删除。
复制文件时使用了操作系统封装好的xcopy命令,因此只需一行代码即可,删除资源是我自己写的。
- 关于xcopy:
有时我们会碰到这种情况,一些文件我们已经修改过、网上面又有最新版本的。原来备份的那份文件我们要及时更新的时候。那怎么才能同步更新呢?当然我们可以把最新的文件复制过去,这也是一种解决办法。
但如果修改的文件有很多,自己也记不清楚哪些文件是更新过的。当有很多文件需要更新时,都要复制过去,这可不是件省力气的活,而且还容易出错,比如一些文件被忘记更新!
这时,我们可以通过xcopy来完成,在命令提示符中输入并运行xcopy e:\*.* d: /s /h /d /y
就可以了!
更多关于xcopy,请在命令提示符中运行xcopy /?
或者查看百度百科:https://baike.baidu.com/item/xcopy - 关于删除资源
xcopy只能实现增
和改
的同步,但对于删
的同步,则没有实现。当源文件夹下的文件夹或者文件被删除时,我们也是需要此删除操作同步至目标文件夹下的。即xcopy只能实现增量同步,如果需要实现全量同步,则需要我们自己再写一个同步删除的功能。 - 关于实时监控:https://blog.csdn.net/COCO56/article/details/101827523
2. 代码
# -*- coding: UTF-8 -*-
import os
import shutil
src=r'G:\\OneDrive - Office Everyday\\视频教程'
des=r'X:\\视频教程'
def copyRes(src, des):
cmd = 'xcopy "' + src +'" \"' + des + '" /s /h /D /y'
os.system(cmd)
print('正在复制资源')
copyRes(src, des)
print('复制完毕')
cnt=0
def delRes(path):
path2 = path.replace(des, src)
if os.path.exists(path2):
return
if os.path.isdir(path):
shutil.rmtree(path)
else:
os.remove(path)
global cnt
cnt+=1
print(cnt, path)
print('正在删除资源')
for root, dirs, files in os.walk(des,topdown=True):
for dir in dirs:
delRes(os.path.join(root, dir))
for file in files:
delRes(os.path.join(root, file))
print('删除完毕')
3. 实际应用
- 打包命令
pyinstaller -F -c 同步文件夹.py --distpath .
- 程序源码
# -*- coding: UTF-8 -*- import os import shutil import time def copyRes(src, des): cmd = 'xcopy "' + src +'" \"' + des + '" /s /h /D /y' os.system(cmd) cnt=0 def delRes(path, des, src): path2 = path.replace(des, src) if os.path.exists(path2): return if os.path.isdir(path): shutil.rmtree(path) else: os.remove(path) global cnt cnt+=1 print(cnt, path) def updateRes(src, des): global cnt cnt=0 print('正在从【',src,'】同步至【', des,'】',sep='') print('正在复制资源') copyRes(src, des) print('复制完毕') print('正在删除资源') for root, dirs, files in os.walk(des,topdown=True): for dir in dirs: delRes(os.path.join(root, dir), des, src) for file in files: delRes(os.path.join(root, file), des, src) print('删除完毕') def run(li): while True: for i in li: updateRes(i[0], i[1]) for i in range(60*30, 0, -1): print("距离下一轮更新还剩:", i, "秒。", end="", sep="") time.sleep(1) print("\r", end="", flush = True) if __name__ == "__main__": li=[ (r'G:\OneDrive - Office Everyday\大型软件', r'X:\大型软件'), (r'G:\OneDrive - Office Everyday\精品软件', r'W:\精品软件'), (r'G:\OneDrive - Office Everyday\开发相关', r'V:\开发相关'), (r'G:\OneDrive - Office Everyday\视频教程', r'U:\视频教程'), (r'G:\OneDrive - Office Everyday\视频教程', r'Y:\视频教程'), (r'G:\OneDrive - Office Everyday\稀缺资源', r'V:\稀缺资源'), (r'E:\OneDrive - 微信公众号奇乐帮\考研视频', r'Z:\考研视频'), ] run(li)